package com.zyj.core.parser;


import com.zyj.core.sqlsource.SqlSource;
import com.zyj.core.sqlsource.StaticSqlSource;
import com.zyj.core.utils.GenericTokenParser;
import com.zyj.core.utils.ParameterMappingTokenHandler;

/**
 * 解析 #{} 之后得到 SELECT * FROM user WHERE sex = ?
 */
public class SqlSourceParser {

    /**
     * 对于两种不同的SqlSource来说，调用该方法解析sql的时机是不同的
     *
     * @param sqlText
     * @return
     */
    public SqlSource parseSqlSource(String sqlText) {
        // 分词处理器（如何处理#{}中的内容）
        // 思路：就是将#{}中的内容封装成ParameterMapping对象，并且放入List集合中
        ParameterMappingTokenHandler tokenHandler = new ParameterMappingTokenHandler();

        // 通用分词解析器
        // openToken:
        // closeToken:
        // TokenHandler:被分出来的词要作何处理
        GenericTokenParser tokenParser = new GenericTokenParser("#{", "}", tokenHandler);

        // 使用通用分词解析器针对指定文本进行解析，解析之后得到JDBC可以执行的SQL语句
        String sql = tokenParser.parse(sqlText);

        System.out.println(sql);
        // 3.将解析出来的SQL语句和参数列表封装到StaticSqlSource中
        // 不仅需要解析完#{}，还需要得到对应的参数映射关系完成封装，将参数映射关系封装到List<ParameterMapping>中
        return new StaticSqlSource(sql, tokenHandler.getParameterMappings());
    }
}
